import requests
from lxml import etree
from bs4 import BeautifulSoup
import json
import csv
import time
import os
from datetime import datetime

def getHTMLtext(url):
 """请求获得网页内容"""
 try:
  r = requests.get(url, timeout = 30)
  r.raise_for_status()
  r.encoding = r.apparent_encoding
  print("Success")
  return r.text
 except:
  print("Fail")
  return" "


def get_content(html, cityname):
     """处理得到有用信息保存数据文件"""
     final = []          # 初始化一个列表保存数据
     bs = BeautifulSoup(html, "html.parser")  # 创建BeautifulSoup对象
     body = bs.body
     # data = body.find('div', {<!-- -->'id': '7d'})    # 找到div标签且id = 7d
     data = body.find('div', {'id': '7d'})
     # 下面爬取当天的数据
     # data2 = body.find_all('div',{<!-- -->'class':'left-div'})
     data2 = body.find_all('div', {'class': 'left-div'})
     text = data2[2].find('script').string
     text = text[text.index('=')+1 :-2]   # 移除改var data=将其变为json数据
     jd = json.loads(text)
     dayone = jd['od']['od2']     # 找到当天的数据
     final_day = []           # 存放当天的数据
     data_all = []
     count = 0
     for i in dayone:
      temp = []
      if count <= 23:
          temp.append(i['od21'])     # 添加时间
          temp.append(cityname+'市')   # 添加城市
          temp.append(i['od22'])     # 添加当前时刻温度
          temp.append(i['od24'])     # 添加当前时刻风力方向
          temp.append(i['od25'])     # 添加当前时刻风级
          temp.append(i['od26'])     # 添加当前时刻降水量
          temp.append(i['od27'])     # 添加当前时刻相对湿度
          temp.append(i['od28'])     # 添加当前时刻控制质量
        #    print(temp)
          final_day.append(temp)
          data_all.append(temp)
      count = count +1
     # 下面爬取24h的数据
     ul = data.find('ul')                     # 找到所有的ul标签
     li = ul.find_all('li')                   # 找到左右的li标签
     i = 0                                    # 控制爬取的天数
     for day in li:                          # 遍历找到的每一个li
         if i <= 7 and i >= 0:
             temp = []                        # 临时存放每天的数据
             date = day.find('h1').string     # 得到日期
             date = date[0:date.index('日')]  # 取出日期号
             temp.append(date)
             inf = day.find_all('p')          # 找出li下面的p标签,提取第一个p标签的值，即天气
             temp.append(inf[0].string)

             tem_low = inf[1].find('i').string   # 找到最低气温

             if inf[1].find('span') is None:   # 天气预报可能没有最高气温
                 tem_high = None
             else:
                 tem_high = inf[1].find('span').string  # 找到最高气温
             temp.append(tem_low[:-1])
             if tem_high[-1] == '℃':
                 temp.append(tem_high[:-1])
             else:
                 temp.append(tem_high)

             wind = inf[2].find_all('span')  # 找到风向
             for j in wind:
                 temp.append(j['title'])

             wind_scale = inf[2].find('i').string # 找到风级
             index1 = wind_scale.index('级')
             temp.append(int(wind_scale[index1-1:index1]))
             final.append(temp)
         i = i + 1
     return final_day,final





def write_to_csv(file_name, data, day=14):
 """保存为csv文件"""
 with open(file_name, 'a', errors='ignore', newline='') as f:
     if day == 14:
         header = ['日期','城市','天气','最低气温','最高气温','风向1','风向2','风级']
     else:
         header = ['小时','城市','温度','风力方向','风级','降水量','相对湿度','空气质量']
     f_csv = csv.writer(f)
     f_csv.writerow(header)
     f_csv.writerows(data)

DATA_DIR = "weather_data"
os.makedirs(DATA_DIR, exist_ok=True)

def save_weather_data(data, city, month):
    """保存天气数据到JSON文件"""
    if data is None or len(data) == 0:
        return False

        # 确保城市目录存在
    city_dir = os.path.join(DATA_DIR, city)
    os.makedirs(city_dir, exist_ok=True)

    # 保存到JSON文件
    filename = os.path.join(city_dir, f"{month}.json")

    try:
        with open(filename, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
        # logger.info(f"Saved data to {filename}")
        return True
    except Exception as e:
        # logger.error(f"Error saving data: {e}")
        return False

Citycode = {
    "上海": "101020100",
    "北京": "101010100",
    "成都": "101270101",
    "广州": "101280101"  # 假设广东指的是广州
}

citycode_lists = list(Citycode.items())
for city_code in citycode_lists:
    city_code = list(city_code)
    print(city_code)
    citycode = city_code[1]
    cityname = city_code[0]
    url1 = 'http://www.weather.com.cn/weather/'+citycode+ '.shtml'    # 24h天气中国天气网

    html1 = getHTMLtext(url1)
    data1, data1_7 = get_content(html1, cityname)  # 获得1-7天和当天的数据

print(data1_7)
# write_to_csv('天气.csv',data1_7,1)